package org.sosim.modelo.memoria;

import java.util.ArrayList;
import java.util.List;

import org.sosim.modelo.instrucao.Instrucao;
import org.sosim.modelo.pagina.Pagina;
import org.sosim.modelo.processo.Processo;
import org.sosim.modelo.programa.Programa;

public class TabelaAlocacaoMemoria {

	private List<Pagina> paginas;
	private final long tamanhoPagina;

	public TabelaAlocacaoMemoria(long tamanhoPagina) {
		this.tamanhoPagina = tamanhoPagina;
		this.paginas = new ArrayList<Pagina>();
	}

	public void requisitarPaginacao(Processo processo, Programa programa, int idInstrucao) {

		long acumulador = 0;
		List<Instrucao> paginadas = new ArrayList<Instrucao>();

		while (true) {

			acumulador += programa.getInstrucoes().get(idInstrucao - 1)
					.getTempoEstimado();

			if (acumulador > tamanhoPagina) {
				break;
			}

			paginadas.add(programa.getInstrucoes().get(idInstrucao - 1));
			idInstrucao++;
		}

		this.paginas.add(new Pagina(processo.getIdProcesso(),tamanhoPagina, paginadas));
	}
	
	public Pagina requisitarPagina(Processo processo, int idInstrucao) throws PageFault{
		for(Pagina pagina:paginas){
			if(pagina.getIdProcesso() == processo.getIdProcesso()){
				for(Instrucao instrucao : pagina.getInstrucoes()){
					if(instrucao.getId() == idInstrucao){
						return pagina;
					}
				}
			}
		}
		throw new PageFault();
	}
}
